//给你一个非空数组，返回此数组中 第三大的数 。如果不存在，则返回数组中最大的数。 
//
// 
//
// 示例 1： 
//
// 
//输入：[3, 2, 1]
//输出：1
//解释：第三大的数是 1 。 
//
// 示例 2： 
//
// 
//输入：[1, 2]
//输出：2
//解释：第三大的数不存在, 所以返回最大的数 2 。
// 
//
// 示例 3： 
//
// 
//输入：[2, 2, 3, 1]
//输出：1
//解释：注意，要求返回第三大的数，是指在所有不同数字中排第三大的数。
//此例中存在两个值为 2 的数，它们都排第二。在所有不同数字中排第三大的数为 1 。 
//
// 
//
// 提示： 
//
// 
// 1 <= nums.length <= 10⁴ 
// -2³¹ <= nums[i] <= 2³¹ - 1 
// 
//
// 
//
// 进阶：你能设计一个时间复杂度 O(n) 的解决方案吗？ 
// Related Topics 数组 排序 👍 363 👎 0


import java.util.TreeSet;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution414 {
    //    public int thirdMax(int[] nums) {
//        Queue<Long> dump = new PriorityQueue<>(new Comparator<Long>() {
//            @Override
//            public int compare(Long o1, Long o2) {
//                Long temporary = o2 - o1;
//                return temporary < 0 ? -1 : 1;
//            }
//        });
//        Set<Long> set = new HashSet<>();
//        for (int i = 0; i < nums.length; i++) {
//            set.add((long) nums[i]);
//        }
//        set.forEach(item -> {
//            dump.add(item);
//        });
//        if (set.size() < 3) {
//            return Math.toIntExact(dump.poll());
//        } else {
//            dump.poll();
//            dump.poll();
//            return Math.toIntExact(dump.poll());
//        }
//    }
    public int thirdMax(int[] nums) {
        TreeSet<Integer> set = new TreeSet<>();
        for (int i = 0; i < nums.length; i++) {
            set.add(nums[i]);
            if (set.size() > 3) {
                set.remove(set.first());
            }
        }
        return set.size() < 3 ? set.last() : set.first();
    }

}
//leetcode submit region end(Prohibit modification and deletion)
